home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
001-025
/
scopedisk1
/
files
/
filereq.c
next >
Wrap
C/C++ Source or Header
|
1995-03-18
|
23KB
|
973 lines
/*
* STDFILE -- Standard File Requestor. Version 2.0a 15 June 1987
*
* AUTHOR -- Peter da Silva US (713) 497-4372
*
* Reorganized by Matthew Dillon for use with * and ?. Added:
* -device name in File string gadget transfered to directory
* gadget without closing the window.
* -bug when requesting volume ""... current directory lock would
* get unlocked!
* -additional intuitive features added
* -coding reorganized
*
* Copyright (c) 1987 Peter da Silva, all rights reserved.
* Changes (c)Copyright 1987 Matthew Dillon, all rights reserved.
*
* This module may be freely used in any product, commercial or
* otherwise, provided credit is given for this module and
* and provided this notice remains intact in the source. The
* intent of this module is to provide a standard file requestor
* such as is available on the Macintosh, in GEM on the IBM-PC
* and Atari ST, and in the Microsoft Windows software on the
* IBM-PC. The advantage this module has over other requestors
* is that it minimises disk accesses: an important consideration
* given the structure of AmigaDos directories. If you need to
* modify it for your needs, by all means go ahead... but please
* conform to the intent of this program as stated above. If you
* have suggestions for improvements, by all means call me at
* the number listed above.
*
* Enhancements in the current version:
*
* Gadgets now boxed. Display generally cleaned up.
*
* True "dictionary order" for searches.
*
* Default pattern can now be specified. Default file name now
* specified in a single argument.
*
* Directories always match.
*
* Null pattern converted to "#?" universal wildcard.
*
* If you attempt to build a file name longer than 128 characters the
* screen will flash and the operation will be aborted.
*
* "Volumes" gadget, using the device list code in "mounted". This
* gadget brings up a list of all currently mounted volumes for
* selection. Volumes leaves the directory specification intact, so
* you can quickly return to where you left off.
*
* With these enhancements it is now possible to select any file on
* any device without touching the keyboard. This is now release 2.0,
* as it is significantly better than 1.0.
*
* Acknowledgements:
*
* Thanks to Jeff Lydiatt for the pattern matching code in PatMatch.c
* Thanks to Jay Miner, =RJ= and the whole Amiga team for the Amiga
* itself.
*
* Environment:
*
* IntuitionBase and GfxBase must be open. dos.library must be open
* under the name "DosLibrary". Link with PatMatch.o and VolList.o.
*
* Usage:
*
* #define MAXFILENAME 128
*
* int stdfile(title, default_file, default_pat, name);
* char *title;
* char *default_file;
* char *default_pattern;
* char name[MAXFILENAME];
*
* +-----------------------------------+
* |o| Title ------------------- | | | title parameter, or "File Name"
* |-----------------------------------|
* | Directory: [ ] | Directory parameter, or current.
* | File name: [ ] | Default parameter, or empty.
* | Pattern: [ ] | Initially empty, if the user
* | +-------------------------------+ | enters anything here it will
* | | [Filename] | | | be used to select files. The
* | | [Filename] | | | file display will also be empty
* | | [Filename] |@@| | to start with to avoid excess
* | | [Filename] |@@| | disk I/O. If the user selects
* | | |@@| | here the directory will be
* | | |@@| | scanned looking for files
* | | | | | matching the specified pattern,
* | | | | | or "*" if no pattern is given.
* | | | | |
* | +-------------------------------+ | ACCEPT returns 1. CANCEL
* | [ACCEPT] [VOLUMES] [CANCEL] | or the close gadget return 0.
* +-----------------------------------+ VOLUMES displays volume names.
*
* The number of filenames displayed is specified at compile time in the
* constant MAXFILES. The maximum size of a filename is specified in the
* constant MAXNAME. The parameter "Default file" will be broken into
* directory and file parts.
*/
char *Copyright =
"stdfile V2.0a. Copyright (c) 1987 Peter da Silva. All rights reserved.";
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <exec/memory.h>
typedef unsigned char ubyte;
typedef unsigned short uword;
typedef unsigned long ulong;
typedef struct FileInfoBlock FIB;
typedef struct DeviceList DEVLIST;
typedef struct DosLibrary DOSLIB;
typedef struct DosInfo DOSINFO;
typedef struct RootNode ROOTNODE;
typedef struct IntuiMessage IMESS;
extern void CalcPropGadget();
extern void ProcessFileName();
extern void *malloc();
extern void *GetMsg();
extern struct Window *OpenWindow();
#define MAXFILES 8
#define MAXNAME 32
#define MAXFULL (MAXNAME*4)
/* SIZING PARAMS */
#define Z NULL
#define INDENT 6
#define LEFTMAR (INDENT-1)
#define BORDER 3
#define CHSIZ 8
#define HT CHSIZ
#define BASELINE 6
/* GADGET BORDERS */
#define IN1 LEFTMAR+10*CHSIZ
#define IN3 LEFTMAR+3
#define IN4 -(INDENT+6*CHSIZ+1)
#define IN5 -(INDENT+CHSIZ*2)
#define IN6 ((WINWD-WD6)/2)
#define WD1 -(INDENT+IN1)
#define WD3 (6*CHSIZ)
#define WD4 (6*CHSIZ)
#define WD5 (CHSIZ*2+2)
#define WD6 (7*CHSIZ)
#define TP1 (CHSIZ+BORDER)
#define TP2 (TP1+HT+1)
#define TP3 (TP2+HT+1)
#define TP4 -(BORDER+HT4-1)
#define TP5 (TP3+HT+BORDER)
#define HT4 (HT+1)
#define HT5 CHSIZ*MAXFILES+INDENT
#define WINHT (TP5 + HT5 + (-TP4) + BORDER)
#define WINWD (INDENT*4 + (MAXNAME+2)*CHSIZ)
#define WININ (640-WINWD)/2
#define WINTP (200-WINHT)/2
#define HOMEX (INDENT+LEFTMAR)
#define HOMEY (TP5+BORDER)
#define LASTX (HOMEX+MAXNAME*CHSIZ)
#define LASTY (HOMEY+MAXFILES*CHSIZ)
#define BTP TP5
#define BIN LEFTMAR
#define BWD (WINWD-INDENT-BIN)
#define BHT (WINHT-BTP-(-TP4+BORDER+1))
#define SF GADGHCOMP|GRELWIDTH
#define SEL SELECTED
#define BF1 GADGHCOMP|GRELBOTTOM
#define BF2 GADGHCOMP|GRELBOTTOM|GRELRIGHT
#define PF GRELRIGHT
#define SA RELVERIFY
#define CEN STRINGCENTER
#define BA RELVERIFY
#define PA RELVERIFY
#define SI(n) (APTR)&STD_String[n]
#define G(n) &STD_Gadget[n]
#define IMAG (APTR)&STD_Image
#define PROP (APTR)&STD_Prop
#define SG STRGADGET
#define BG BOOLGADGET
#define PG PROPGADGET
#define FP AUTOBACKPEN
#define BP AUTOFRONTPEN
#define OKTEXT &STD_OK
#define NOTEXT &STD_CANCEL
#define VLTEXT &STD_VOLUME
static int DoneFlag;
#define DirName SBuffer[0]
#define FileName SBuffer[1]
#define PatName SBuffer[2]
#define STRINGS 3
static UBYTE SBuffer[STRINGS][MAXFULL];
static UBYTE Undo[MAXFULL];
static struct StringInfo STD_String[STRINGS] = {
{SBuffer[0],Undo,0,MAXFULL,0},
{SBuffer[1],Undo,0,MAXFULL,0},
{SBuffer[2],Undo,0,MAXFULL,0}
};
static struct PropInfo STD_Prop = { AUTOKNOB|FREEVERT, 0, 0, 0, 0 };
static struct IntuiText STD_OK =
{ FP, BP, JAM2, 0, 1, Z, (UBYTE *)"ACCEPT", Z };
static struct IntuiText STD_CANCEL =
{ FP, BP, JAM2, 0, 1, Z, (UBYTE *)"CANCEL", Z };
static struct IntuiText STD_VOLUME =
{ FP, BP, JAM2, 0, 1, Z, (UBYTE *)"VOLUMES", Z };
#define BUTTONS 3
#define BUTVEC 8
static SHORT butvecs[BUTTONS][BUTVEC*2] = {
{ -2, HT4, -2, -1, WD3+1,-1, WD3+1,HT4, -3, HT4, -3,-1, WD3+2,-1, WD3+2, HT4 },
{ -2, HT4, -2, -1, WD4+1,-1, WD4+1,HT4, -3, HT4, -3,-1, WD4+2,-1, WD4+2, HT4 },
{ -2, HT4, -2, -1, WD6+1,-1, WD6+1,HT4, -3, HT4, -3,-1, WD6+2,-1, WD6+2, HT4 }
};
static struct Border ButBorder[BUTTONS] = {
{0, 0, FP, BP, JAM1, BUTVEC, butvecs[0], NULL},
{0, 0, FP, BP, JAM1, BUTVEC, butvecs[1], NULL},
{0, 0, FP, BP, JAM1, BUTVEC, butvecs[2], NULL}
};
#define BB(n) (APTR)&ButBorder[n]
static struct Image STD_Image;
#define DIRID 0
#define FILID 1
#define PATID 2
#define YESID 3
#define CANID 4
#define VOLID 5
#define BARID 6
#define GADGETS 7
static struct Gadget STD_Gadget[GADGETS] = {
/*NEXT, LFT, TP,WDTH, H, FLAG, ACT, TYP, REND, Z, TXT, Z, SPEC, ID, Z */
{ G(1), IN1,TP1, WD1,HT, SF, SA, SG, Z, Z, Z, Z, SI(0), 0, 0 },
{ G(2), IN1,TP2, WD1,HT, SF|SEL, SA, SG, Z, Z, Z, Z, SI(1), 1, 0 },
{ G(3), IN1,TP3, WD1,HT, SF, SA, SG, Z, Z, Z, Z, SI(2), 2, 0 },
{ G(4), IN3,TP4, WD3,HT4,BF1, BA, BG,BB(0), Z, OKTEXT, Z, Z, 3, 0 },
{ G(5), IN4,TP4, WD4,HT4,BF2, BA, BG,BB(1), Z, NOTEXT, Z, Z, 4, 0 },
{ G(6), IN6,TP4, WD6,HT4,BF1, BA, BG,BB(2), Z, VLTEXT, Z, Z, 5, 0 },
{ NULL, IN5,TP5, WD5,HT5,PF, PA, PG, IMAG, Z, Z, Z, PROP, 6, 0 }
};
static struct NewWindow STD_NewWindow = {
WININ, WINTP, WINWD, WINHT, -1, -1,
REFRESHWINDOW|MOUSEBUTTONS|GADGETUP|CLOSEWINDOW,
WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|SIMPLE_REFRESH|ACTIVATE,
G(0), NULL, (ubyte *)"File Name Requestor",
NULL, NULL, 0, 0, 0, 0, WBENCHSCREEN
};
static struct Window *STD_Window;
#define NVEC 6
static SHORT Vectors[NVEC*2] = {
BIN+1, BTP,
BIN+1, BTP+BHT,
BIN+BWD, BTP+BHT,
BIN+BWD, BTP,
BIN, BTP,
BIN, BTP+BHT
};
static struct Border STD_FileBox = {
0, 0, FP, BP, JAM1, NVEC, Vectors, NULL
};
static struct IntuiText STD_Text[3] = {
{ FP, BP, JAM2, 0, 0, NULL, (UBYTE *)"Directory:", NULL },
{ FP, BP, JAM2, 0, 0, NULL, (UBYTE *)"File Name:", NULL },
{ FP, BP, JAM2, 0, 0, NULL, (UBYTE *)"Pattern:", NULL }
};
static
OpenFileWindow()
{
extern struct IntuitionBase *IntuitionBase;
int i;
/* Rebuild gadget list */
STD_NewWindow.FirstGadget = &STD_Gadget[0];
for(i = 0; i < GADGETS; i++)
STD_Gadget[i].NextGadget = (i==GADGETS-1)?(0):(&STD_Gadget[i+1]);
for(i = 0; i < STRINGS; i++) {
STD_String[i].BufferPos = strlen(SBuffer[i]);
STD_String[i].DispPos = 0;
}
STD_Prop.VertBody = 0xFFFF;
STD_Prop.VertPot = 0;
if (!(STD_Window = OpenWindow(&STD_NewWindow)))
return(0);
/* This optional line will activate a string gadget */
if (IntuitionBase->LibNode.lib_Version > 32)
ActivateGadget(G(1),STD_Window,0L);
CalcPropGadget();
PaintFileWindow();
return (1);
}
static
CloseFileWindow()
{
STD_NewWindow.LeftEdge = STD_Window->LeftEdge;
STD_NewWindow.TopEdge = STD_Window->TopEdge;
if (STD_Window)
CloseWindow(STD_Window);
}
static int State;
#define INITIAL 0
#define DIRECTORY 1
static
PaintFileWindow()
{
DrawBorder(STD_Window->RPort, &STD_FileBox, 0, 0);
PrintIText(STD_Window->RPort, &STD_Text[0], LEFTMAR, TP1);
PrintIText(STD_Window->RPort, &STD_Text[1], LEFTMAR, TP2);
PrintIText(STD_Window->RPort, &STD_Text[2], LEFTMAR, TP3);
if (State == DIRECTORY)
PrintFileNames();
}
static int FirstFile;
static int Selected;
static int NumFiles;
static struct dirent {
struct dirent *nextfile;
SHORT filetype;
char *filename;
} *NameList, **NameTable;
#define FILETYPE 0
#define DIRTYPE 1
#define VOLTYPE 2
static
PrintFileNames()
{
int i;
for (i = 0; i < MAXFILES; ++i) {
SetBPen(STD_Window->RPort, BP);
SetAPen(STD_Window->RPort, BP);
RectFill(STD_Window->RPort, HOMEX, HOMEY+i*CHSIZ, LASTX, HOMEY+(i+1)*CHSIZ);
if (i+FirstFile < NumFiles)
PrintName(i+FirstFile, i+FirstFile == Selected);
}
}
static
PrintName(file, hilite)
int file;
int hilite;
{
int i;
i = file - FirstFile;
Move(STD_Window->RPort, HOMEX, HOMEY+i*CHSIZ+BASELINE);
if (hilite == 0) {
SetBPen(STD_Window->RPort, BP);
if(NameTable[file]->filetype == FILETYPE)
SetAPen(STD_Window->RPort, FP);
else
SetAPen(STD_Window->RPort, 3);
} else {
SetAPen(STD_Window->RPort, BP);
if(NameTable[file]->filetype == FILETYPE)
SetBPen(STD_Window->RPort, FP);
else
SetBPen(STD_Window->RPort, 3);
}
Text(STD_Window->RPort, NameTable[file]->filename, strlen(NameTable[file]->filename));
}
static
void
CalcPropGadget()
{
int VertPot, VertBody;
if (State == INITIAL)
return;
if (NumFiles <= MAXFILES) {
VertBody = 0xFFFF;
VertPot = 0;
FirstFile = 0;
} else {
VertBody = ((MAXFILES<<16)-1) / NumFiles;
VertPot = 0;
FirstFile = 0;
}
ModifyProp(&STD_Gadget[BARID], STD_Window, NULL,
STD_Prop.Flags, 0, VertPot, 0, VertBody
);
}
static
void
CalcFilePosition()
{
short old_pos;
if (State == INITIAL)
return;
old_pos = FirstFile;
if (NumFiles<=MAXFILES) {
FirstFile = 0;
} else {
int VertPot = STD_Prop.VertPot;
FirstFile = ((VertPot+1)*(NumFiles-MAXFILES))>>16;
}
if (old_pos != FirstFile)
PrintFileNames();
}
FreeList(list)
struct dirent *list;
{
struct dirent *ptr;
while(list) {
ptr = list->nextfile;
if (list->filename)
free(list->filename);
free(list);
list = ptr;
}
}
static
ReadNewDir()
{
struct dirent *NewList, **NewTable, *ptr;
int NewCount;
FIB *fib;
BPTR dirlock;
if (State != DIRECTORY) {
NameTable = 0;
NameList = 0;
}
if (DirName[0]) {
dirlock = Lock(DirName, ACCESS_READ);
} else {
BPTR ram;
if (ram = Lock("RAM:", ACCESS_READ)) {
dirlock = CurrentDir(ram);
CurrentDir(dirlock);
dirlock = DupLock(dirlock); /* added */
UnLock(ram);
}
}
if (!dirlock)
return(0);
if ((fib = (FIB *)malloc(sizeof(FIB))) == NULL) {
UnLock(dirlock);
return 0;
}
if (!Examine(dirlock, fib)) {
UnLock(dirlock);
free(fib);
return 0;
}
if (fib->fib_DirEntryType < 0) {
UnLock(dirlock);
free(fib);
return 0;
}
NewList = 0;
NewCount = 0;
while(ExNext(dirlock, fib)) {
NewCount += 1;
ptr = (struct dirent *)malloc(sizeof(struct dirent));
if (ptr == 0) {
FreeList(NewList);
UnLock(dirlock);
free(fib);
return(0);
}
ptr->nextfile = NewList;
ptr->filetype = (fib->fib_DirEntryType<0)?FILETYPE:DIRTYPE;
ptr->filename = malloc(strlen(fib->fib_FileName)+1);
if (ptr->filename == 0) {
FreeList(ptr);
UnLock(dirlock);
free(fib);
return(0);
}
strcpy(ptr->filename, fib->fib_FileName);
NewList = ptr;
}
free(fib);
if (DirName[0])
UnLock(dirlock);
NewTable = malloc(sizeof(struct dirent *) * NewCount);
if (NewTable==0) {
FreeList(NewList);
return(0);
}
FreeList(NameList);
NameList = NewList;
if (NameTable)
free(NameTable);
NameTable = NewTable;
if (PatName[0]==0)
SetPatName("*");
State = DIRECTORY;
Selected = -1;
ReCalcPattern();
}
static
ReadVol()
{
struct dirent *NewList, **NewTable, *ptr;
int NewCount;
char name[MAXNAME];
if (State != DIRECTORY) {
NameTable = 0;
NameList = 0;
}
OpenVolList();
NewList = 0;
NewCount = 0;
while(ReadVolList(name)) {
NewCount += 1;
ptr = (struct dirent *)malloc(sizeof(struct dirent));
if (ptr==0) {
FreeList(NewList);
return(0);
}
ptr->nextfile = NewList;
ptr->filetype = VOLTYPE;
ptr->filename = malloc(strlen(name)+1);
if (ptr->filename == 0) {
FreeList(ptr);
return(0);
}
strcpy(ptr->filename, name);
NewList = ptr;
}
CloseVolList();
NewTable = malloc(sizeof(struct dirent *)*NewCount);
if (NewTable==0) {
FreeList(NewList);
return(0);
}
FreeList(NameList);
NameList = NewList;
if (NameTable)
free(NameTable);
NameTable = NewTable;
if (PatName[0]==0)
SetPatName("*");
State = DIRECTORY;
Selected = -1;
ReCalcPattern();
}
/* this routine does a true dictionary search:
*
* Devs < devs but Devs > devices
*/
static
table_compare(p1, p2)
struct dirent **p1, **p2;
{
char *s1, *s2;
char c1, c2;
char firstdiff;
s1 = (*p1)->filename;
s2 = (*p2)->filename;
firstdiff = 0;
while(*s1 && *s2) {
c1 = *s1++;
c2 = *s2++;
if (firstdiff==0)
firstdiff = c1 - c2;
if (c1 >= 'A' && c1 <= 'Z') c1 = c1+'@';
if (c2 >= 'A' && c2 <= 'Z') c2 = c2+'@';
if (c1 != c2)
return c1 - c2;
}
return firstdiff;
}
static
sort_table()
{
qsort(NameTable, NumFiles, sizeof(struct dirent *), table_compare);
return 1;
}
static
ReCalcPattern()
{
if (State != DIRECTORY) {
ReadNewDir();
} else {
struct dirent *ptr;
if (!PatName[0])
SetPatName("*");
NumFiles = 0;
for (ptr = NameList; ptr; ptr=ptr->nextfile) {
/* Directories always match. Is this good? */
if (ptr->filetype == DIRTYPE || ptr->filetype == VOLTYPE || newwildcmp(PatName, ptr->filename)) {
NameTable[NumFiles] = ptr;
NumFiles++;
}
}
sort_table();
CalcPropGadget();
Selected = -1;
PrintFileNames();
}
}
static
SetGadgetText(id, text)
int id;
char *text;
{
int position;
position = RemoveGadget(STD_Window, G(id));
if (position != -1) {
strcpy(SBuffer[id], text);
STD_String[id].BufferPos = strlen(text);
position = AddGadget(STD_Window, G(id), -1);
if (position != -1)
RefreshGadgets(G(id), STD_Window, NULL);
}
}
static
SetDirName(name)
char *name;
{
char buffer[MAXFULL+1], *ptr;
int index;
char lastchar;
/* Can't enter a file name too long. */
if (strlen(DirName) + strlen(name) + 1 > MAXFULL) {
DisplayBeep();
return(0);
}
index = 0;
lastchar = 0;
for (ptr = (char *)DirName; *ptr; ptr++)
buffer[index++] = lastchar = *ptr;
if (lastchar != ':' && lastchar != 0)
buffer[index++] = '/';
strcpy(&buffer[index], name);
SetGadgetText(DIRID, buffer);
SetGadgetText(FILID, "");
return(1);
}
static
SetFileName(name)
char *name;
{
/* Can't enter a file name too long. */
if (strlen(DirName) + strlen(name) + 1 > MAXFULL) {
DisplayBeep();
return(0);
}
SetGadgetText(FILID, name);
return(1);
}
static
SetPatName(name)
char *name;
{
SetGadgetText(PATID, name);
}
static
ProcessGadget(id)
int id;
{
switch(id) {
case DIRID: ReadNewDir(); break;
case FILID: ProcessFileName(); break;
case PATID: ReCalcPattern(); break;
case BARID: CalcFilePosition(); break;
case YESID: DoneFlag = 1; break;
case CANID: DoneFlag = -1; break;
case VOLID: ReadVol(); break;
}
}
/*
* ProcessFileName() added by Matthew Dillon. If the requested file is
* actually a directory, do a ReadNewDir() instead of quiting.
*/
void
ProcessFileName()
{
register char *ptr;
register short len;
BPTR fillock;
char buf[128];
FIB *fib = (FIB *)malloc(sizeof(FIB));
if (fib == NULL) {
DoneFlag = 1;
return;
}
for (ptr = (char *)FileName; *ptr; ++ptr) {
if (*ptr == ':') {
DirName[0] = '\0';
break;
}
}
strcpy(buf, DirName);
if (FileName[0]) {
if (len = strlen(buf)) {
if (buf[len-1]!=':')
strcat(buf, "/");
}
strcat(buf, FileName);
if (fillock = Lock(buf, ACCESS_READ)) {
if (Examine(fillock, fib)) {
if (fib->fib_DirEntryType > 0) {
SetGadgetText(DIRID, buf);
SetGadgetText(FILID, "");
ReadNewDir();
free(fib);
UnLock(fillock);
return;
}
}
UnLock(fillock);
}
}
free(fib);
DoneFlag = 1;
}
static
ProcessMouse(x, y, code, seconds, micros)
{
int NewSelected;
static int oseconds = 0, omicros = 0;
if (x < HOMEX || y < HOMEY || x >= LASTX || y >= LASTY)
return;
if ((code & SELECTUP) == SELECTUP)
return;
if (State != DIRECTORY) {
ReadNewDir();
return;
}
NewSelected = (y-HOMEY)/CHSIZ + FirstFile;
if (NewSelected == Selected) {
if (Selected != -1) {
if (DoubleClick(oseconds, omicros, seconds, micros)) {
if (NameTable[Selected]->filetype == DIRTYPE) {
if (SetDirName(NameTable[Selected]->filename))
ReadNewDir();
} else if (NameTable[Selected]->filetype == VOLTYPE) {
SetGadgetText(DIRID, NameTable[Selected]->filename);
SetGadgetText(FILID, "");
ReadNewDir();
} else if (!SetFileName(NameTable[Selected]->filename)) {
Selected = -1;
DoneFlag = 1;
}
}
}
} else {
if (Selected != -1 && Selected >= FirstFile && Selected < FirstFile+MAXFILES)
PrintName(Selected, 0);
Selected = NewSelected;
if (Selected >= NumFiles) {
Selected = -1;
} else {
if (SetFileName(NameTable[Selected]->filename))
PrintName(Selected, 1);
else
Selected = -1;
if (IntuitionBase->LibNode.lib_Version > 32)
ActivateGadget(G(1),STD_Window,0L);
}
}
oseconds = seconds;
omicros = micros;
}
stdfile(title, deffile, defpat, name)
char *title, *deffile, *defpat, *name;
{
IMESS *im;
if(title)
STD_NewWindow.Title = (UBYTE *)title;
else
STD_NewWindow.Title = (UBYTE *)"Enter File Name";
if (deffile) {
int i;
for (i = strlen(deffile)-1; i >= 0; --i) {
if (deffile[i]==':' || deffile[i]=='/') {
int hold;
strcpy(FileName, &deffile[i+1]);
if (deffile[i]==':')
i++;
hold = deffile[i];
deffile[i] = 0;
strcpy(DirName, deffile);
deffile[i] = hold;
break;
}
}
if (i < 0) {
strcpy(FileName, deffile);
DirName[0] = 0;
}
} else {
DirName[0] = 0;
FileName[0] = 0;
}
if (defpat)
strcpy(PatName, defpat);
else
PatName[0] = 0;
State = INITIAL;
NameTable = 0;
NameList = 0;
if(!OpenFileWindow())
return(0);
DoneFlag = 0;
while (!DoneFlag) {
Wait(1<<STD_Window->UserPort->mp_SigBit);
while(im = GetMsg(STD_Window->UserPort)) {
switch(im->Class) {
case CLOSEWINDOW:
DoneFlag = -1;
break;
case MOUSEBUTTONS:
ProcessMouse(im->MouseX, im->MouseY, im->Code, im->Seconds, im->Micros);
break;
case GADGETUP:
ProcessGadget(((struct Gadget *)im->IAddress)->GadgetID);
break;
case REFRESHWINDOW:
BeginRefresh(STD_Window);
PaintFileWindow();
EndRefresh(STD_Window, 1);
break;
}
ReplyMsg(im);
}
}
CloseFileWindow();
FreeList(NameList);
if (NameTable)
free(NameTable);
if (DoneFlag == 1) {
int len;
strcpy(name, DirName);
if (FileName[0]) {
if (len = strlen(name)) {
if (name[len-1]!=':')
strcat(name, "/");
}
strcat(name, FileName);
return(1);
}
}
return(0);
}
/*
* VOLLIST.C
*/
#define toAPTR(b) ((b)<<2)
#define toBPTR(a) ((a)>>2)
struct DeviceList *list;
OpenVolList()
{
extern DOSLIB *DOSBase;
ROOTNODE *root;
DOSINFO *info;
root = (ROOTNODE *)DOSBase->dl_Root;
info = (DOSINFO *)toAPTR(root->rn_Info);
list = (DEVLIST *)toAPTR(info->di_DevInfo);
}
ReadVolList(name)
char *name;
{
register DEVLIST *next;
while(list) {
next = (DEVLIST *)toAPTR(list->dl_Next);
if (list->dl_Type == DLT_VOLUME) {
char *ptr;
int count;
ptr = (char *)toAPTR((BPTR)list->dl_Name);
count = *ptr++;
if (count > 30)
count = 30;
strncpy(name, ptr, count);
name[count++] = ':';
name[count] = 0;
list = next;
return(1);
}
list = next;
}
return(0);
}
CloseVolList()
{
}